﻿/**
 * 将JSON格式的数据转化为字符串并返回
 * 
 * @param value：JSON格式的数据
 * @returns JSON转化后的字符串
 */
function ztlJsonToString(value) {
	if (!value && value !== false && value != 0) {
		return "null";
	}
	var a = [];
	var type = typeof value;
	if (type == "number") {
		a.push(value);
	} else if (type == 'string') {
		a.push('"' + value.replace(/\"/g, '\\\"') + '"');
	} else if (type != 'object') {
		a.push(value);
	} else {
		if (value.constructor == Date) {
			a.push(value);
		} else if (value.constructor == Array) {
			a.push("[");
			var i = 0;
			for (; i < value.length; i++) {
				a.push(ztlJsonToString(value[i]));
				a.push(",");
			}
			if (i > 0) {
				a.pop();
			}
			a.push("]");
		} else {
			a.push("{");
			var key = null;
			for (key in value) {
				a.push('"' + key + '":');
				a.push(ztlJsonToString(value[key]));
				a.push(",");
			}
			if (key) {
				a.pop();
			}
			a.push("}");
		}
	}
	return a.join("");
}

var ztl_color = [ "yellow", "blue", "red", "green", "purple", "white", "brown", "yellow", "blue", "red", "green", "purple", "white", "brown", "yellow", "blue", "red", "green", "purple", "white", "brown", "yellow", "blue", "red", "green", "purple", "white", "brown" ];

/**
 * 将JSON格式转换为具有层次结构的Table。
 * 
 * @param value
 * @returns
 */
function ztlJsonToTable(value, n) {
	if (!value && value !== false && value != 0) {
		return "null";
	}
	n = n || 0;
	var a = [];
	var type = typeof value;
	if (type != "object") {
		a.push(value);
	} else {
		if (value.constructor == Date) {
			a.push(value);
		} else if (value.constructor == Array) {
			a.push("<table style='background:" + ztl_color[n] + "'><tbody><tr>");
			for ( var i = 0; i < value.length; i++) {
				a.push("<td>");
				a.push(ztlJsonToTable(value[i], n + 1));
				a.push("</td>");
			}
			a.push("</tr></tbody></table>");
		} else {
			a.push("<table style='background:" + ztl_color[n] + "'><tbody>");
			for ( var key in value) {
				a.push("<tr><td>");
				a.push(key);
				a.push("</td><td>");
				a.push(ztlJsonToTable(value[key], n + 1));
				a.push("</td></tr>");
			}
			a.push("</tbody></table>");
		}
	}
	return a.join("");
}

/**
 * 将JSON格式转换为具有层次结构的Table。并且限制最大的递归层数。 存在这个函数的意义在于有一些对象它的子属性又指向其自身，如果
 * 递归的话就会无限循环，看不到任何结果。运用该函数就可以有效的 避免这个问题，通过指定一个最大的递归层数，到达这个层数就会退 出该递归。
 * 
 * @param value
 * @returns
 */
function ztlJsonToLimitTable(value, limit, n) {
	if (!value && value !== false && value != 0) {
		return "null";
	}
	n = n || 0;
	var a = [];
	var type = typeof value;
	if (type != "object") {
		a.push(value);
	} else {
		if (value.constructor == Date) {
			a.push(value);
		} else if (value.constructor == Array) {
			if (n >= limit) {
				return "[......]";
			}
			a.push("<table style='background:" + ztl_color[n] + "'><tbody><tr>");
			for ( var i = 0; i < value.length; i++) {
				a.push("<td>");
				a.push(ztlJsonToLimitTable(value[i], limit, n + 1));
				a.push("</td>");
			}
			a.push("</tr></tbody></table>");
		} else {
			if (n >= limit) {
				return "{......}";
			}
			a.push("<table style='background:" + ztl_color[n] + "'><tbody>");
			for ( var key in value) {
				if (JSON == value[key])
					continue;
				a.push("<tr><td>");
				a.push(key);
				a.push("</td><td>");
				a.push(ztlJsonToLimitTable(value[key], limit, n + 1));
				a.push("</td></tr>");
			}
			a.push("</tbody></table>");
		}
	}
	return a.join("");
}

/**
 * 在id为_test_的DOM中向后添加(append)value，如果没有定义id为_test_
 * 的DOM，则该函数会自动添加id为_test_的div。如果value是JSON格式，会 将它转换为String或Table。
 * 
 * @param value
 *            需要解析的JSON数据或者对象 limit 默认值为0，没有最大的限制层数。如果有值的话表示最大限 制的递归层数。 type
 *            默认值为0，表示将value解析成Table，如果值为1的话表示 将value解析成string。 notMove
 *            默认情况下为false移动，如果为true，则不移动。
 */
function ztlPrint(value, limit, type, notMove) {
	limit = limit || 0;
	type = type || 0;

	var str = "";
	if (type == 0) {
		if (limit === 0) {
			str = ztlJsonToTable(value);
		} else {
			str = ztlJsonToLimitTable(value, limit);
		}
	} else if (type == 1) {
		str = ztlJsonToString(value);
	}

	if ($("#_test_")[0]) {
		$("#_test_").append(str);
	} else {
		var sb = new StringBuilder();
		sb += "<div id='_test_' style='position:absolute;top:0px;left:0px'>";
		sb += str;
		sb += "</div>";
		$("body").append(sb.toString());
	}
	if (!notMove) { // 不传递move值的时候或者传递值为假的时候默认可以移动。
		ztlMoveTable();
	}
}

/**
 * 给id为_test_的DOM添加事件。 在该DOM上单击鼠标，然后拖动可以进入移动该DOM状态，再将单击取消移动状态。
 */
function ztlMoveTable() {
	if (!$("#_test_")[0]) { // 如果不存在id为_test_的控件，直接返回。
		return;
	}
	var _x_ = 0, _y_ = 0, pre_x_ = 0, pre_y_ = 0;
	var move = false;
	$("#_test_").css({
		postion : "absolute",
		left : "0px",
		top : "0px"
	}).click(function(e) {
		_x_ = e.pageX;
		_y_ = e.pageY;
		pre_x_ = parseInt($(this).css("left"));
		pre_y_ = parseInt($(this).css("top"));
		move = !move;
	}).mousemove(function(e) {
		if (move) {
			$(this).css({
				left : (pre_x_ + e.pageX - _x_) + "px",
				top : (pre_y_ + e.pageY - _y_) + "px"
			});
		}
	});
}

/**
 * 数组中是否包含某个元素
 * 
 * @param array
 * @param item
 * @returns {Boolean}
 */
function contains(array, item) {
	if (array.constructor == Array && item.constructor == String) {
		for ( var i = 0; i < array.length; i++) {
			if (array[i] == item) {
				return true;
			}
		}
	}
	return false;
}

/**
 * 返回数组中某个元素的下一个元素
 */
function arrayNext(array, item) {
	if (array.constructor == Array && item.constructor == String) {
		for ( var i = 0, len = array.length; i < len; i++) {
			if (array[i] == item) {
				if (i == len - 1) {
					return array[0];
				} else {
					return array[i + 1];
				}
			}
		}
	}
	return null;
}

/**
 * 返回数组中某个元素的上一个元素
 */
function arrayPrev(array, item) {
	if (array.constructor == Array && item.constructor == String) {
		for ( var i = array.length - 1; i >= 0; i--) {
			if (array[i] == item) {
				if (i == 0) {
					return array[array.length - 1];
				} else {
					return array[i - 1];
				}
			}
		}
	}
	return null;
}

/**
 * 产生一个不重复的随机数组，0到max-1，其中len必须小于等于max
 * 
 * @param max
 * @param len
 */
function randomArray(max, len, except) {
	var array = [];
	if (len > max) {
		return array;
	}
	except = except || except == 0 ? except : -1;
	var random = 0;
	while (len > 0) {
		random = parseInt(Math.random() * max);
		if (random != except && notInArray(array, random)) {
			array.push(random);
			len--;
		} else {
			for (; random < max; random++) {
				if (random != except && notInArray(array, random)) {
					array.push(random);
					len--;
					break;
				}
			}
			if (random == max) {
				for (random = 0; random < max; random++) {
					if (random != except && notInArray(array, random)) {
						array.push(random);
						len--;
						break;
					}
				}
			}
		}
	}
	return array;
}

function notInArray(array, value) {
	for ( var i = 0, len = array.length; i < len; i++) {
		if (array[i] == value) {
			return false;
		}
	}
	return true;
}

/**
 * 
 */
function autoSwitch(imgId, time, iframe) {
	if (iframe) {
		var img = $(iframe).contents().find(imgId);
		if (img.length < 1) {
			return;
		}
		img.trigger('next');
		setTimeout('autoSwitch("' + imgId + '",' + time + ',"' + iframe + '")', time);
	} else {
		var img = $(imgId);
		if (img.length < 1) {
			return;
		}
		img.trigger('next');
		setTimeout('autoSwitch("' + imgId + '",' + time + ')', time);
	}
}

/**
 * 显示一个警告框 将obj前面加上"debug : "并显示出对话框，作用就是方便一点。
 * 
 * @param {Object}
 *            obj
 */
function dg(obj) {
	alert("debug : " + obj);
}

/**
 * 获取滚动条距离顶端的距离
 * 
 * @return {}支持IE6
 */
function getScrollTop() {
	var scrollPos = 0;
	if (window.pageYOffset) {
		scrollPos = window.pageYOffset;
	} else if (document.compatMode && document.compatMode != 'BackCompat') {
		scrollPos = document.documentElement.scrollTop;
	} else if (document.body) {
		scrollPos = document.body.scrollTop;
	}
	return scrollPos;
}

/**
 * 获取当前窗口文档的高度
 * 
 * @returns
 */
function getViewHeight() {
	return $(document).height();
}

/**
 * 获取可视区域的高度
 * 
 * @returns
 */
function getTotalHeight() {

	if ($.browser.msie) {
		return document.compatMode == "CSS1Compat" ? document.documentElement.clientHeight : document.body.clientHeight;
	} else {
		return self.innerHeight;
	}
}

/**
 * 获取可视区域的宽度
 * 
 * @returns
 */
function getTotalWidth() {

	if ($.browser.msie) {
		return document.compatMode == "CSS1Compat" ? document.documentElement.clientWidth : document.body.clientWidth;
	} else {
		return self.innerWidth;
	}
}
/**
 * StringBuilder类。
 * 
 * @returns
 */
function StringBuilder() {
	this._element_ = new Array();
}
StringBuilder.prototype.append = function(item) {
	this._element_.push(item);
};
StringBuilder.prototype.toString = function() {
	return this._element_.join("");
};
StringBuilder.prototype.join = function() {
	return this._element_.join(seperator);
};
StringBuilder.prototype.length = function() {
	return this._element_.length;
};

/**
 * JSON对象，如果浏览器不支持JSON对象，就自己定义一个JSON对象，用于$.ls
 */
if (typeof JSON == 'undefined') {
	var JSON = {
		/**
		 * 
		 * @param str
		 * @returns
		 */
		parse : function(str) {
			return eval('(' + str + ')');
		},
		/**
		 * 
		 */
		stringify : ztlJsonToString

	};
}